package DecoratorPattern.cake;

/**
 * 
 *说明：如何体现动态加载，而不是在编译阶段就确定好实例的所有特征？

        凡是new出实例都是在“运行阶段”进行的，假如有三个装饰物： 装饰物A，装饰物B, 装饰物C
       装饰者模式：三个装饰者类，使用时任意组合，可以有A,B,C,AB,AC,BC,ABC共7种组合。
       传统继承的方式：三个装饰者类，使用时实例化子类，只有A,B,C三种组合，而且在编译
                  阶段就规定要了可能的所有组合方式，要达到前面的效果，就必须有七个装饰者类。
       最显著的区别：装饰者模式只需定义好几个基本装饰元素，最终的装饰结果由这些“装饰元素”
       在运行期任意组合。
 */
public class Test{

    public static void main(String[] args) {
        System.out.println("开始测试装饰者模式。。。");
        
        Cake theCake=new WhiteCake();
        
        //测试“被装饰者”
        theCake.printDescription();
        System.out.println("");
        
        //测试单重“装饰者”
        CakeDecorator theSingleCakeDecorator=new MilkCake(theCake);
        theSingleCakeDecorator.printDescription();
        System.out.println("");
        
        //测试多重“装饰者”
        CakeDecorator theMultiCakeDecorator=new ChocolateCake(new MilkCake(theCake));
        theMultiCakeDecorator.printDescription();
        System.out.println("");
    }

}